/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.citas.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.citas.entidad.ControlCita;
import com.nys.conci.citas.entidad.EstadoCita;
import com.nys.conci.citas.servicio.ServicioControlCitas;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

/**
 *
 * @author Yeudy10
 * @since 29/01/2013
 */
@ManagedBean
@ViewScoped
public class BeanRegistroEstadoCita extends BeanBase {

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioAdministracion sa;
    @Inject
    private ServicioControlCitas scc;
    private EstadoCita estadoCita;
    private EstadoCita estadoCitaSelect;
    private EstadoCita estadoCitaTabla;
    private List<EstadoCita> lista_estado_cita;
    private String nombre;
    private String descripcion;
    private String numero;
    boolean modificar;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanRegistroEstadoCita() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            setNombre("");
            setDescripcion("");
            setEstadoCita(new EstadoCita());
            setEstadoCitaSelect(new EstadoCita());
            setEstadoCitaTabla(new EstadoCita());
            setLista_estado_cita(new ArrayList<EstadoCita>());
            setModificar(false);
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        cargarEstadosCita();
        numero = "1";
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Método qie carga una lista de estados de citas
     */
    public void cargarEstadosCita() {
        try {
            lista_estado_cita = new ArrayList<EstadoCita>();
            lista_estado_cita = sa.consultarListaEstadoCita();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que guarda o actualiza un estado de cita y vuelve a cargar la
     * lista de estados con el estado guardado
     */
    public void agregarEstadoCita() {
        try {
            if (validarCampos()) {
                if (modificar) {
                    estadoCitaSelect.setDescripcion(getDescripcion());
                    estadoCitaSelect.setNombre(getNombre());
                    sa.guardarEstadoCita(estadoCitaSelect, modificar);

                } else {
                    setEstadoCita(new EstadoCita());
                    getEstadoCita().setDescripcion(getDescripcion());
                    getEstadoCita().setNombre(getNombre());
                    sa.guardarEstadoCita(getEstadoCita(), modificar);
                }
                cargarEstadosCita();
                limpiar();
                modificar = false;
                numero = "1";
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que limpia los campos de la pantalla
     */
    public void limpiar() {
        try {
            nombre = "";
            descripcion = "";
            setEstadoCita(new EstadoCita());
            setEstadoCitaSelect(new EstadoCita());
            setEstadoCitaTabla(new EstadoCita());
            modificar = false;
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida que los campos de la pantalla esten correctos
     *
     * @return true si esta correcto de lo contrario false
     */
    private boolean validarCampos() {
        boolean resultado = true;
        if (getNombre() == null || getNombre().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nombre", mensaje);
            resultado = false;
        }
        if (getDescripcion() == null || getDescripcion().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Descripción");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_descripcion", mensaje);
            resultado = false;
        }

        if (lista_estado_cita != null && nombre != null && !nombre.isEmpty()) {
            boolean va = false;
            for (EstadoCita estado : lista_estado_cita) {
                if (modificar && !estado.getId_estado_cita().equals(estadoCitaSelect.getId_estado_cita()) && estado.getNombre().equals(nombre)) {
                    va = true;
                } else if (!modificar && estado.getNombre().equals(nombre)) {
                    va = true;
                }
            }
            if (va) {
                String mensaje = "No se permite ingresar estados de citas con nombres iguales";
                MensajeUtil.agregarMensajeError(mensaje);
                resultado = false;
            }
        }
        return resultado;
    }

    /**
     * Método llamado cuando se selecciona una fila de la tabla y carga los
     * datos en la pantalla
     */
    public void modificarEstadoCita() {
        try {
            estadoCitaSelect = estadoCitaTabla;
            modificar = true;
            setDescripcion(estadoCitaSelect.getDescripcion());
            setNombre(estadoCitaSelect.getNombre());
            numero = "0";

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que elimina un estado de citas y carga la tabla con los datos
     * restantes
     */
    public void eliminarEstadoCita() {
        try {
            if (validarUsado()) {
                sa.eliminar(estadoCitaSelect);
                cargarEstadosCita();
                limpiar();
                numero = "1";
                String mensaje = "Se eliminó el estado seleccionado";
                MensajeUtil.agregarMensajeInfo(mensaje);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida si el estado está asociado a un cita
     *
     * @return true o false
     */
    private boolean validarUsado() {
        try {
            List<ControlCita> cc = new ArrayList<ControlCita>();
            cc = scc.consultaListaCitasIdEstado(estadoCitaSelect.getId_estado_cita());
            if (cc != null || !cc.isEmpty()) {
                String mensaje = "No se puede eliminar, el estado esta asociado a una cita";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return true;
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the estadoCita
     */
    public EstadoCita getEstadoCita() {
        return estadoCita;
    }

    /**
     * @param estadoCita the estadoCita to set
     */
    public void setEstadoCita(EstadoCita estadoCita) {
        this.estadoCita = estadoCita;
    }

    /**
     * @return the estadoCitaSelect
     */
    public EstadoCita getEstadoCitaSelect() {
        return estadoCitaSelect;
    }

    /**
     * @param estadoCitaSelect the estadoCitaSelect to set
     */
    public void setEstadoCitaSelect(EstadoCita estadoCitaSelect) {
        this.estadoCitaSelect = estadoCitaSelect;
    }

    /**
     * @return the estadoCitaTabla
     */
    public EstadoCita getEstadoCitaTabla() {
        return estadoCitaTabla;
    }

    /**
     * @param estadoCitaTabla the estadoCitaTabla to set
     */
    public void setEstadoCitaTabla(EstadoCita estadoCitaTabla) {
        this.estadoCitaTabla = estadoCitaTabla;
    }

    /**
     * @return the lista_estado_cita
     */
    public List<EstadoCita> getLista_estado_cita() {
        return lista_estado_cita;
    }

    /**
     * @param lista_estado_cita the lista_estado_cita to set
     */
    public void setLista_estado_cita(List<EstadoCita> lista_estado_cita) {
        this.lista_estado_cita = lista_estado_cita;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }
}
